package fileProcessors.implementations;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import fileProcessors.FileProcessor;

public class KorrelationSplit extends FileProcessor {
	private File file;
	private BufferedReader br;
	private BufferedWriter bw;
	private BufferedWriter outputWriter;

	public KorrelationSplit() {
		super("Split",".fcs","");
	}

	private void openFile(File file) {
		this.file=file;
		try {
			// neuen bufferedReader zum Lesen der Eingangsdatei
			br = new BufferedReader(new FileReader(file));
		} catch (FileNotFoundException e) {
			try {
				outputWriter.write("FEHLER: Datei "+file.getName()+" konnte nicht ge�ffnet werden.");
				outputWriter.newLine();
			} catch (IOException e1) {
			}
		}
	}

	private void analyze(File currentDirectory) {
		String line = null;
		try {
			boolean blockFound = false;
			int lineCounter = 0;
			int blockStart = 0;
			// erste vier funde werden weggeworfen
			// counter zhlt blcke
			int blockCounter = -3;
			// n�chste Zeile lesen bis zum Dateienede
			while ((line = br.readLine()) != null) {
				if (line.contains("BEGIN Correlation")) {
					if (blockCounter <= 0) {
						//die ersten 4 funde werden abgeschnitten da hier keine Bl�cke folgen
						blockFound = false;
					} else {
						// diese bl�cke werden gew�nscht
						blockFound = true;
						blockStart = lineCounter;

						// neue Output-Datei erzeugen
						bw = new BufferedWriter(new FileWriter(new File(currentDirectory,file.getName().substring(0, file.getName().length() - 4)
								+ "_m" + blockCounter + ".txt")));
					}
					blockCounter++;
				}
				if (line.contains("BEGIN FitParameters") && blockFound) {
					blockFound = false;
					if (bw != null) {
						bw.close();
					}
				}
				if (blockFound) {
					// 5zeilen nach Begin Correlation abschneiden
					if (lineCounter - blockStart > 5) {
						//Leerzeichen am Zeilenanfang abschneiden
						line=line.substring(4);
//						System.out.print(line+"\r\n");
						bw.write(line);
						bw.newLine();
					}
				}
				lineCounter++;
			}
			if(blockCounter>0){
				outputWriter.write("Datei "+file.getAbsolutePath()+" geteilt in "+(blockCounter-1)+" Teile.");
				outputWriter.newLine();
			}else {
				outputWriter.write("WARNUNG: Keine Bl�cke in "+file.getAbsolutePath()+" gefunden.");
				outputWriter.newLine();
			}
		
		} catch (IOException e) {
			try {
				outputWriter.write("FEHLER: Fehler beim Aufteilen der Datei "+file.getAbsolutePath());
				outputWriter.newLine();
			} catch (IOException e1) {
			}
		}
	}

	@Override
	public void processFiles(File files[], File currentDirectory, File outputFile) {
		try {
			outputWriter=new BufferedWriter(new FileWriter(outputFile));
		} catch (IOException e) {
		}
		for(int i=0; i<files.length; i++){
			openFile(files[i]);
			analyze(currentDirectory);
		}
		try {
			outputWriter.close();
		} catch (IOException e) {
		}
	}

	@Override
	public String getInformation() {		
		return "Liest die Mikroskopdateien \"*.fcs\" und findet die einzelnen Messreihen." +
				" Diese werden in einzelne Dateien numeriert  mit Namen \"*_m#.txt\" gespeichert.";
	}

	@Override
	public String getDate() {
		return "05.06.2012";
	}
}

